package com.example.xmhds_1.service.impl;

import com.example.xmhds_1.common.cache.UserInfoCacheManager;
import com.example.xmhds_1.entity.UserInfo;
import com.example.xmhds_1.mapper.userinfo.UserInfoMapper;
import com.example.xmhds_1.service.UserInfoService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;

/**
 * 用户信息服务实现类
 * 处理用户基本信息的增删改查
 */
@Slf4j
@Service
public class UserInfoServiceImpl implements UserInfoService {

    @Autowired
    private UserInfoMapper userInfoMapper;//Mybatis的Mapper接口
    @Autowired
    private UserInfoCacheManager userInfoCacheManager;//UserInfo缓存管理器

    /**
     * 创建用户信息
     * 在用户注册时调用，将用户信息保存到user_info表
     *
     * @param accountId 关联的账号ID
     * @param username 用户名
     * @return 创建成功返回用户信息，失败返回null
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public UserInfo createUserInfo(String accountId, String username) {
        // 检查是否已存在
        if(userInfoCacheManager.getUserInfo(accountId) != null){
            //先用缓存查查看
            log.warn("用户信息已存在: accountId={}", accountId);
            return null;
        }else if (getByAccountId(accountId) != null) {
            log.warn("用户信息已存在: accountId={}", accountId);
            return null;
        }

        // 创建新用户信息
        UserInfo userInfo = new UserInfo();
        userInfo.setAccountId(accountId);
        userInfo.setUsername(username);
        userInfo.setCreateTime(LocalDateTime.now());
        userInfo.setUpdateTime(LocalDateTime.now());
        userInfo.setDeleted(0);

        // 保存到数据库
        //log.info("创建用户信息: accountId={}, username={}", accountId, username);
        userInfoMapper.insert(userInfo);
        userInfo.setId(Long.valueOf(accountId));
        userInfoCacheManager.saveUserInfo(userInfo);
        return userInfo;
    }

    /**
     * 根据账号ID获取用户信息
     *
     * @param accountId 账号ID
     * @return 用户信息，不存在返回null
     */
    @Override
    public UserInfo getByAccountId(String accountId) {
        //log.debug("查询用户信息: accountId={}", accountId);
        UserInfo userInfo = userInfoCacheManager.getUserInfo(accountId);
        if (userInfo == null){
            //先用缓存查查看,缓存中没有就,使用数据库
            userInfo= userInfoMapper.selectOne(accountId);
            userInfoCacheManager.saveUserInfo(userInfo);
        }
        return userInfo;
    }

    /**
     * 更新用户信息
     * 可以更新用户名等基本信息
     *
     * @param userInfo 用户信息
     * @return 更新成功返回true，失败返回false
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean updateUserInfo(UserInfo userInfo) {
        if (userInfo.getId() == null) {
            log.warn("更新用户信息失败: id为空");
            return false;
        }

        userInfo.setUpdateTime(LocalDateTime.now());
        //log.info("更新用户信息: id={}, username={}", userInfo.getId(), userInfo.getUsername());
        return userInfoMapper.updateById(userInfo) > 0;
    }

    /**
     * 通过账号获取对应的accountId
     *
     * @param username
     * @return
     */
    @Override
    public String getUserIdByUsername(String username) {
        String data = userInfoCacheManager.getAccountIdByAccount(username);
        if (data== null){
            //先用缓存查查看,缓存中没有就,使用数据库,把数据库中的加载到缓存中
            data = userInfoMapper.getUserIdByUsername(username);
            if(data!=null) {
                //把数据库的加载到缓存
                UserInfo userInfo=userInfoMapper.selectOne(data);
                userInfoCacheManager.saveUserInfo(userInfo);
            }
        }
        return data;
    }
}
